home *** CD-ROM | disk | FTP | other *** search
/ QRZ! Ham Radio 1 / QRZ Ham Radio Callsign Database - December 1993.iso / ucsd / packet / tcpip / sys5 / iscwmpst.z / iscwmpst / tcp / src / tnserv.c < prev    next >
Encoding:
C/C++ Source or Header  |  1991-04-18  |  2.1 KB  |  99 lines

  1. /* @(#) $Header: tnserv.c,v 1.7 91/04/17 19:48:06 deyke Exp $ */
  2.  
  3. #include "global.h"
  4. #include "mbuf.h"
  5. #include "socket.h"
  6. #include "netuser.h"
  7. #include "tcp.h"
  8. #include "login.h"
  9.  
  10. static struct tcb *tcb_server;
  11.  
  12. /*---------------------------------------------------------------------------*/
  13.  
  14. static void tnserv_recv_upcall(tcb, cnt)
  15. struct tcb *tcb;
  16. int  cnt;
  17. {
  18.   struct mbuf *bp;
  19.  
  20.   if (tcb->user) {
  21.     recv_tcp(tcb, &bp, 0);
  22.     login_write((struct login_cb *) tcb->user, bp);
  23.   }
  24. }
  25.  
  26. /*---------------------------------------------------------------------------*/
  27.  
  28. static void tnserv_send_upcall(tcb, cnt)
  29. struct tcb *tcb;
  30. int  cnt;
  31. {
  32.   struct mbuf *bp;
  33.  
  34.   if (tcb->user &&
  35.       (bp = login_read((struct login_cb *) tcb->user, space_tcp(tcb))))
  36.     send_tcp(tcb, bp);
  37. }
  38.  
  39. /*---------------------------------------------------------------------------*/
  40.  
  41. static void tnserv_state_upcall(tcb, old, new)
  42. struct tcb *tcb;
  43. int  old, new;
  44. {
  45.   switch (new) {
  46. #ifdef  QUICKSTART
  47.   case TCP_SYN_RECEIVED:
  48. #else
  49.   case TCP_ESTABLISHED:
  50. #endif
  51.     tcb->user = (int) login_open(pinet_tcp(&tcb->conn.remote), "TELNET", (void (*)()) tnserv_send_upcall, (void (*)()) close_tcp, tcb);
  52.     if (!tcb->user)
  53.       close_tcp(tcb);
  54.     else
  55.       log(tcb, "open TELNET");
  56.     break;
  57.   case TCP_CLOSE_WAIT:
  58.     close_tcp(tcb);
  59.     break;
  60.   case TCP_CLOSED:
  61.     if (tcb->user) {
  62.       login_close((struct login_cb *) tcb->user);
  63.       log(tcb, "close TELNET");
  64.     }
  65.     del_tcp(tcb);
  66.     if (tcb == tcb_server) tcb_server = NULLTCB;
  67.     break;
  68.   }
  69. }
  70.  
  71. /*---------------------------------------------------------------------------*/
  72.  
  73. int  telnet0(argc, argv, p)
  74. int  argc;
  75. char  *argv[];
  76. void *p;
  77. {
  78.   if (tcb_server) close_tcp(tcb_server);
  79.   return 0;
  80. }
  81.  
  82. /*---------------------------------------------------------------------------*/
  83.  
  84. int  telnet1(argc, argv, p)
  85. int  argc;
  86. char  *argv[];
  87. void *p;
  88. {
  89.   struct socket lsocket;
  90.  
  91.   if (tcb_server) close_tcp(tcb_server);
  92.   lsocket.address = INADDR_ANY;
  93.   lsocket.port = (argc < 2) ? IPPORT_TELNET : tcp_port_number(argv[1]);
  94.   tcb_server = open_tcp(&lsocket, NULLSOCK, TCP_SERVER, 0, tnserv_recv_upcall,
  95.             tnserv_send_upcall, tnserv_state_upcall, 0, 0);
  96.   return 0;
  97. }
  98.  
  99.